{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第一题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/constants.py:158: FutureWarning: The pandas.datetime class is deprecated and will be removed from pandas in a future version. Import from datetime instead.\n",
      "  MIN_TIMESTAMP = pd.Timestamp(pd.datetime(1677, 9, 22, 0, 12, 44), tz='utc')\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:881: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:427: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:447: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:488: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:504: UserWarning:\n",
      "\n",
      "Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:510: UserWarning:\n",
      "\n",
      "Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:84: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:515: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>lda_predict</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>spam</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4135</td>\n",
       "      <td>64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>45</td>\n",
       "      <td>593</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "lda_predict     0    1\n",
       "spam                  \n",
       "0            4135   64\n",
       "1              45  593"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# LDA分类器实验\n",
    "# 读取垃圾短信数据集\n",
    "import pandas as pd \n",
    "from nlpia.data.loaders import get_data \n",
    "# 更好地显示宽列消息文本\n",
    "pd.options.display.width = 120 \n",
    "sms = get_data('sms-spam') \n",
    "# 通过添加感叹号 区分垃圾短消息\n",
    "index = ['sms{}{}'.format(i, '!'*j) for (i,j) in zip(range(len(sms)), sms.spam)] \n",
    "sms = pd.DataFrame(sms.values, columns=sms.columns, index=index) \n",
    "sms['spam'] = sms.spam.astype(int) \n",
    "# 查看数据\n",
    "len(sms)\n",
    "sms.spam.sum() \n",
    "sms.head(6)\n",
    "# TF-IDF向量\n",
    "# 导入模块\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer \n",
    "from nltk.tokenize.casual import casual_tokenize \n",
    "# 分词\n",
    "tfidf_model = TfidfVectorizer(tokenizer=casual_tokenize) \n",
    "# 转化为TF-IDF向量\n",
    "tfidf_docs = tfidf_model.fit_transform( raw_documents=sms.text).toarray() \n",
    "tfidf_docs.shape \n",
    "sms.spam.sum() \n",
    "# 计算垃圾类和非垃圾类地质心\n",
    "mask = sms.spam.astype(bool).values \n",
    "spam_centroid = tfidf_docs[mask].mean(axis=0) \n",
    "ham_centroid = tfidf_docs[~mask].mean(axis=0) \n",
    "# 质心向量\n",
    "spam_centroid.round(2) \n",
    "ham_centroid.round(2)\n",
    "# 通过用一个质心向量减去另一个质心向量得到分类线\n",
    "spamminess_score = tfidf_docs.dot(spam_centroid -ham_centroid) \n",
    "spamminess_score.round(2) \n",
    "# 绘制2d图像\n",
    "from sklearn.decomposition import PCA\n",
    "from matplotlib import pyplot as plt\n",
    "pca_model = PCA(n_components=3)\n",
    "tfidf_docs_3d = pca_model.fit_transform(tfidf_docs)\n",
    "df = pd.DataFrame(tfidf_docs_3d)\n",
    "ax = df[~mask].plot(x=0, y=1, kind='scatter', alpha=.5, c='green')\n",
    "df[mask].plot(x=0, y=1, ax=ax, alpha=.1, kind='scatter', c='red')\n",
    "plt.xlabel(' x')\n",
    "plt.ylabel(' y')\n",
    "plt.savefig('spam_lda_2d_scatter.png')\n",
    "# 绘制3d图像\n",
    "import plotly as py\n",
    "spam_trace = dict(\n",
    "        x=df[0][mask], y=df[1][mask], z=df[2][mask],\n",
    "        type=\"scatter3d\", mode='markers',\n",
    "        marker= dict(size=3, color='red', line=dict(width=0)) \n",
    "    )\n",
    "ham_trace = dict(\n",
    "        x=df[0][~mask], y=df[1][~mask], z=df[2][~mask],\n",
    "        type=\"scatter3d\", mode='markers',\n",
    "        marker= dict(size=3, color='green', line=dict(width=0)) \n",
    "    )\n",
    "fig = dict(data=[ham_trace, spam_trace], layout={'title': 'LDA Spamminess Model'})\n",
    "py.offline.plot(fig, filename='lda_spam_3d_scatter.html')\n",
    "# LDA分类器训练\n",
    "from sklearn.preprocessing import MinMaxScaler \n",
    "sms['lda_score'] = MinMaxScaler().fit_transform(spamminess_score.reshape(-1,1)) \n",
    "# 阈值设置为50%\n",
    "sms['lda_predict'] = (sms.lda_score > .5).astype(int) \n",
    "# 查看结果\n",
    "sms['spam lda_predict lda_score'.split()].round(2).head(6)\n",
    "# 性能得分\n",
    "(1. - (sms.spam - sms.lda_predict).abs().sum() / len(sms)).round(3)\n",
    "# 混淆矩阵\n",
    "from pugnlp.stats import Confusion \n",
    "Confusion(sms['spam lda_predict'.split()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:427: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:447: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:488: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:504: UserWarning:\n",
      "\n",
      "Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:510: UserWarning:\n",
      "\n",
      "Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:84: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pugnlp/stats.py:515: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>lda_predict</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>spam</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4135</td>\n",
       "      <td>64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>45</td>\n",
       "      <td>593</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "lda_predict     0    1\n",
       "spam                  \n",
       "0            4135   64\n",
       "1              45  593"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Confusion(sms['spam lda_predict'.split()])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第二题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nlpia/futil.py:421: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n",
      "100%|██████████| 263/263 [00:00<00:00, 242653.31it/s]\n"
     ]
    }
   ],
   "source": [
    "# LSA实验\n",
    "# LSA主题-词矩阵\n",
    "import _locale\n",
    "_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8' ])\n",
    "from nlpia.book.examples.ch04_catdog_lsa_3x6x16 import word_topic_vectors \n",
    "# 查看数据\n",
    "word_topic_vectors.T.round(1)\n",
    "# 运用lsa_models()获得文档-词项矩阵\n",
    "from nlpia.book.examples.ch04_catdog_lsa_sorted import lsa_models, prettify_tdm \n",
    "bow_svd, tfidf_svd = lsa_models() \n",
    "prettify_tdm(**bow_svd)\n",
    "# 查看结果\n",
    "tdm = bow_svd['tdm']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 左奇异向量 U\n",
    "import numpy as np \n",
    "U, s, Vt = np.linalg.svd(tdm) \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ipykernel_launcher.py:6: FutureWarning:\n",
      "\n",
      "The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.44</td>\n",
       "      <td>-0.44</td>\n",
       "      <td>-0.31</td>\n",
       "      <td>-0.44</td>\n",
       "      <td>-0.44</td>\n",
       "      <td>-0.20</td>\n",
       "      <td>-0.01</td>\n",
       "      <td>-0.01</td>\n",
       "      <td>-0.08</td>\n",
       "      <td>-0.31</td>\n",
       "      <td>-0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.09</td>\n",
       "      <td>-0.09</td>\n",
       "      <td>0.19</td>\n",
       "      <td>-0.09</td>\n",
       "      <td>-0.09</td>\n",
       "      <td>-0.09</td>\n",
       "      <td>0.37</td>\n",
       "      <td>0.47</td>\n",
       "      <td>0.56</td>\n",
       "      <td>0.19</td>\n",
       "      <td>0.47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.16</td>\n",
       "      <td>-0.16</td>\n",
       "      <td>0.52</td>\n",
       "      <td>-0.16</td>\n",
       "      <td>-0.16</td>\n",
       "      <td>-0.29</td>\n",
       "      <td>-0.22</td>\n",
       "      <td>-0.32</td>\n",
       "      <td>0.17</td>\n",
       "      <td>0.52</td>\n",
       "      <td>-0.32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.00</td>\n",
       "      <td>-0.00</td>\n",
       "      <td>-0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>-0.00</td>\n",
       "      <td>0.71</td>\n",
       "      <td>-0.00</td>\n",
       "      <td>-0.00</td>\n",
       "      <td>-0.71</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.04</td>\n",
       "      <td>-0.04</td>\n",
       "      <td>-0.14</td>\n",
       "      <td>-0.04</td>\n",
       "      <td>-0.04</td>\n",
       "      <td>0.58</td>\n",
       "      <td>0.13</td>\n",
       "      <td>-0.33</td>\n",
       "      <td>0.62</td>\n",
       "      <td>-0.14</td>\n",
       "      <td>-0.33</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.09</td>\n",
       "      <td>-0.09</td>\n",
       "      <td>0.10</td>\n",
       "      <td>-0.09</td>\n",
       "      <td>-0.09</td>\n",
       "      <td>0.51</td>\n",
       "      <td>-0.73</td>\n",
       "      <td>0.27</td>\n",
       "      <td>-0.01</td>\n",
       "      <td>0.10</td>\n",
       "      <td>0.27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-0.57</td>\n",
       "      <td>0.21</td>\n",
       "      <td>0.11</td>\n",
       "      <td>0.33</td>\n",
       "      <td>-0.31</td>\n",
       "      <td>0.34</td>\n",
       "      <td>0.34</td>\n",
       "      <td>0.00</td>\n",
       "      <td>-0.34</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.32</td>\n",
       "      <td>0.47</td>\n",
       "      <td>0.25</td>\n",
       "      <td>-0.63</td>\n",
       "      <td>0.41</td>\n",
       "      <td>0.07</td>\n",
       "      <td>0.07</td>\n",
       "      <td>0.00</td>\n",
       "      <td>-0.07</td>\n",
       "      <td>-0.18</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.50</td>\n",
       "      <td>0.29</td>\n",
       "      <td>-0.20</td>\n",
       "      <td>0.41</td>\n",
       "      <td>0.16</td>\n",
       "      <td>-0.37</td>\n",
       "      <td>-0.37</td>\n",
       "      <td>-0.00</td>\n",
       "      <td>0.37</td>\n",
       "      <td>-0.17</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-0.15</td>\n",
       "      <td>-0.15</td>\n",
       "      <td>-0.59</td>\n",
       "      <td>-0.15</td>\n",
       "      <td>0.42</td>\n",
       "      <td>0.04</td>\n",
       "      <td>0.04</td>\n",
       "      <td>-0.00</td>\n",
       "      <td>-0.04</td>\n",
       "      <td>0.63</td>\n",
       "      <td>-0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>-0.26</td>\n",
       "      <td>-0.62</td>\n",
       "      <td>0.33</td>\n",
       "      <td>0.24</td>\n",
       "      <td>0.54</td>\n",
       "      <td>0.09</td>\n",
       "      <td>0.09</td>\n",
       "      <td>0.00</td>\n",
       "      <td>-0.09</td>\n",
       "      <td>-0.23</td>\n",
       "      <td>-0.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      0     1     2     3     4     5     6     7     8     9     10\n",
       "0  -0.44 -0.44 -0.31 -0.44 -0.44 -0.20 -0.01 -0.01 -0.08 -0.31 -0.01\n",
       "1  -0.09 -0.09  0.19 -0.09 -0.09 -0.09  0.37  0.47  0.56  0.19  0.47\n",
       "2  -0.16 -0.16  0.52 -0.16 -0.16 -0.29 -0.22 -0.32  0.17  0.52 -0.32\n",
       "3   0.00 -0.00 -0.00  0.00  0.00  0.00 -0.00  0.71 -0.00 -0.00 -0.71\n",
       "4  -0.04 -0.04 -0.14 -0.04 -0.04  0.58  0.13 -0.33  0.62 -0.14 -0.33\n",
       "5  -0.09 -0.09  0.10 -0.09 -0.09  0.51 -0.73  0.27 -0.01  0.10  0.27\n",
       "6  -0.57  0.21  0.11  0.33 -0.31  0.34  0.34  0.00 -0.34  0.23  0.00\n",
       "7  -0.32  0.47  0.25 -0.63  0.41  0.07  0.07  0.00 -0.07 -0.18  0.00\n",
       "8  -0.50  0.29 -0.20  0.41  0.16 -0.37 -0.37 -0.00  0.37 -0.17  0.00\n",
       "9  -0.15 -0.15 -0.59 -0.15  0.42  0.04  0.04 -0.00 -0.04  0.63 -0.00\n",
       "10 -0.26 -0.62  0.33  0.24  0.54  0.09  0.09  0.00 -0.09 -0.23 -0.00"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "pd.DataFrame(U, index=tdm.index).round(2)\n",
    "# 奇异值向量 S\n",
    "s.round(1) \n",
    "S = np.zeros((len(U), len(Vt))) \n",
    "pd.np.fill_diagonal(S, s) \n",
    "pd.DataFrame(S).round(1) \n",
    "# 右奇异向量 V\n",
    "pd.DataFrame(Vt).round(2) \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.55, 0.55, 0.55, 0.55, 0.55, 0.55])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 词项-文档矩阵重构误差\n",
    "err = [] \n",
    "for numdim in range(len(s), 0, -1): \n",
    "    S[numdim - 1, numdim - 1] = 0 \n",
    "    reconstructed_tdm = U.dot(S).dot(Vt) \n",
    "    err.append(np.sqrt(((reconstructed_tdm - tdm).values.flatten() ** 2).sum() \n",
    "        / np.product(tdm.shape)))\n",
    "np.array(err).round(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.5504818825631803,\n",
       " 0.5504818825631803,\n",
       " 0.5504818825631803,\n",
       " 0.5504818825631803,\n",
       " 0.5504818825631803,\n",
       " 0.5504818825631803]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "err"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第三题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sms0</th>\n",
       "      <th>sms1</th>\n",
       "      <th>sms2!</th>\n",
       "      <th>sms3</th>\n",
       "      <th>sms4</th>\n",
       "      <th>sms5!</th>\n",
       "      <th>sms6</th>\n",
       "      <th>sms7</th>\n",
       "      <th>sms8!</th>\n",
       "      <th>sms9!</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>sms0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.6</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.6</td>\n",
       "      <td>-0.0</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms1</th>\n",
       "      <td>0.6</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.8</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms2!</th>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.5</td>\n",
       "      <td>0.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms3</th>\n",
       "      <td>0.6</td>\n",
       "      <td>0.8</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>-0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms4</th>\n",
       "      <td>-0.0</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.4</td>\n",
       "      <td>-0.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms5!</th>\n",
       "      <td>-0.3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.4</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms6</th>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.1</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>-0.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms7</th>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.3</td>\n",
       "      <td>-0.3</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.1</td>\n",
       "      <td>0.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms8!</th>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.5</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>-0.4</td>\n",
       "      <td>0.3</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms9!</th>\n",
       "      <td>-0.3</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>0.4</td>\n",
       "      <td>-0.1</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.4</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>0.4</td>\n",
       "      <td>0.3</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       sms0  sms1  sms2!  sms3  sms4  sms5!  sms6  sms7  sms8!  sms9!\n",
       "sms0    1.0   0.6   -0.1   0.6  -0.0   -0.3  -0.3  -0.1   -0.3   -0.3\n",
       "sms1    0.6   1.0   -0.2   0.8  -0.2    0.0  -0.2  -0.2   -0.1   -0.1\n",
       "sms2!  -0.1  -0.2    1.0  -0.2   0.1    0.4   0.0   0.3    0.5    0.4\n",
       "sms3    0.6   0.8   -0.2   1.0  -0.2   -0.3  -0.1  -0.3   -0.2   -0.1\n",
       "sms4   -0.0  -0.2    0.1  -0.2   1.0    0.2   0.0   0.1   -0.4   -0.2\n",
       "sms5!  -0.3   0.0    0.4  -0.3   0.2    1.0  -0.1   0.1    0.3    0.4\n",
       "sms6   -0.3  -0.2    0.0  -0.1   0.0   -0.1   1.0   0.1   -0.2   -0.2\n",
       "sms7   -0.1  -0.2    0.3  -0.3   0.1    0.1   0.1   1.0    0.1    0.4\n",
       "sms8!  -0.3  -0.1    0.5  -0.2  -0.4    0.3  -0.2   0.1    1.0    0.3\n",
       "sms9!  -0.3  -0.1    0.4  -0.1  -0.2    0.4  -0.2   0.4    0.3    1.0"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# PCA实验\n",
    "# 三维向量上的PCA\n",
    "import pandas as pd \n",
    "# 更适合页宽的输出\n",
    "pd.set_option('display.max_columns', 6) \n",
    "from sklearn.decomposition import PCA \n",
    "from matplotlib import pyplot as plt \n",
    "from nlpia.data.loaders import get_data \n",
    "df = get_data('pointcloud').sample(1000) \n",
    "# 将三维点云缩减为二维投影\n",
    "pca = PCA(n_components=2) \n",
    "df2d = pd.DataFrame(pca.fit_transform(df), columns=list('xy')) \n",
    "df2d.plot(kind='scatter', x='x', y='y') \n",
    "# 查看结果\n",
    "plt.show() \n",
    "# 计算TF-IDF向量\n",
    "import pandas as pd \n",
    "# 导入短消息数据\n",
    "from nlpia.data.loaders import get_data \n",
    "pd.options.display.width = 120 \n",
    "sms = get_data('sms-spam') \n",
    "# 在短消息后加\"!\" 以便识别\n",
    "index = ['sms{}{}'.format(i, '!'*j) for (i,j) in zip(range(len(sms)), sms.spam)] \n",
    "sms.index = index \n",
    "# 查看数据\n",
    "sms.head(6)\n",
    "# 计算每条消息的TF-IDF向量\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer \n",
    "from nltk.tokenize.casual import casual_tokenize \n",
    "# 分词\n",
    "tfidf = TfidfVectorizer(tokenizer=casual_tokenize) \n",
    "tfidf_docs = tfidf.fit_transform(raw_documents=sms.text).toarray() \n",
    "len(tfidf.vocabulary_) \n",
    "tfidf_docs = pd.DataFrame(tfidf_docs) \n",
    "# 中心化处理\n",
    "tfidf_docs = tfidf_docs - tfidf_docs.mean() \n",
    "tfidf_docs.shape \n",
    "# 输出结果\n",
    "sms.spam.sum() \n",
    "# 基于PCA的短消息语义分析\n",
    "from sklearn.decomposition import PCA \n",
    "# 将数据集9232维的TF-IDF向量转换为16维主题向量\n",
    "pca = PCA(n_components=16) \n",
    "pca = pca.fit(tfidf_docs) \n",
    "pca_topic_vectors = pca.transform(tfidf_docs) \n",
    "columns = ['topic{}'.format(i) for i in range(pca.n_components)] \n",
    "pca_topic_vectors = pd.DataFrame(pca_topic_vectors, columns=columns,index=index) \n",
    "# 查看数据\n",
    "pca_topic_vectors.round(3).head(6) \n",
    "tfidf.vocabulary_\n",
    "column_nums, terms = zip(*sorted(zip(tfidf.vocabulary_.values(),tfidf.vocabulary_.keys()))) \n",
    "terms\n",
    "# 输出PCA中转换的权重值\n",
    "weights = pd.DataFrame(pca.components_, columns=terms,index=['topic{}'.format(i) for i in range(16)]) \n",
    "pd.options.display.max_columns = 8 \n",
    "weights.head(4).round(3) \n",
    "# 查看特定词汇\n",
    "pd.options.display.max_columns = 12 \n",
    "deals = weights['! ;) :) half off free crazy deal only $ 80 %'.split()].round(3) * 100\n",
    "# 查看数据 \n",
    "deals\n",
    "deals.T.sum()\n",
    "# 基于截断SVD的短消息语义分析\n",
    "from sklearn.decomposition import TruncatedSVD \n",
    "# 计算16个主题 迭代100次\n",
    "svd = TruncatedSVD(n_components=16, n_iter=100) \n",
    "svd_topic_vectors = svd.fit_transform(tfidf_docs.values) \n",
    "svd_topic_vectors = pd.DataFrame(svd_topic_vectors, columns=columns,index=index) \n",
    "# 查看数据\n",
    "svd_topic_vectors.round(3).head(6)\n",
    "# 基于LSA的垃圾短消息分类\n",
    "import numpy as np \n",
    "# 对每个主题向量按照其长度进行归一化 然后用点积计算余弦相似度\n",
    "svd_topic_vectors = (svd_topic_vectors.T / np.linalg.norm(svd_topic_vectors, axis=1)).T \n",
    "# 查看数据\n",
    "svd_topic_vectors.iloc[:10].dot(svd_topic_vectors.iloc[:10].T).round(1)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第四题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# LDiA实验\n",
    "# 基于LDiA主题模型的短消息语义分析\n",
    "from sklearn.feature_extraction.text import CountVectorizer \n",
    "from nltk.tokenize import casual_tokenize \n",
    "np.random.seed(42)\n",
    "# 计算词袋向量 \n",
    "counter = CountVectorizer(tokenizer=casual_tokenize) \n",
    "bow_docs = pd.DataFrame(counter.fit_transform(raw_documents=sms.text).toarray(), index=index) \n",
    "column_nums, terms = zip(*sorted(zip(counter.vocabulary_.values(),counter.vocabulary_.keys()))) \n",
    "bow_docs.columns = terms\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>topic0</th>\n",
       "      <th>topic1</th>\n",
       "      <th>topic2</th>\n",
       "      <th>topic3</th>\n",
       "      <th>topic4</th>\n",
       "      <th>topic5</th>\n",
       "      <th>...</th>\n",
       "      <th>topic10</th>\n",
       "      <th>topic11</th>\n",
       "      <th>topic12</th>\n",
       "      <th>topic13</th>\n",
       "      <th>topic14</th>\n",
       "      <th>topic15</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>!</th>\n",
       "      <td>184.03</td>\n",
       "      <td>15.00</td>\n",
       "      <td>72.22</td>\n",
       "      <td>394.95</td>\n",
       "      <td>45.48</td>\n",
       "      <td>36.14</td>\n",
       "      <td>...</td>\n",
       "      <td>37.42</td>\n",
       "      <td>44.18</td>\n",
       "      <td>64.40</td>\n",
       "      <td>297.29</td>\n",
       "      <td>41.16</td>\n",
       "      <td>11.70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"</th>\n",
       "      <td>0.68</td>\n",
       "      <td>4.22</td>\n",
       "      <td>2.41</td>\n",
       "      <td>0.06</td>\n",
       "      <td>152.35</td>\n",
       "      <td>0.06</td>\n",
       "      <td>...</td>\n",
       "      <td>8.42</td>\n",
       "      <td>11.42</td>\n",
       "      <td>0.07</td>\n",
       "      <td>62.72</td>\n",
       "      <td>12.27</td>\n",
       "      <td>0.06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>#</th>\n",
       "      <td>0.06</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.06</td>\n",
       "      <td>2.07</td>\n",
       "      <td>...</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.06</td>\n",
       "      <td>1.07</td>\n",
       "      <td>4.05</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 16 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   topic0  topic1  topic2  topic3  topic4  topic5  ...  topic10  topic11  \\\n",
       "!  184.03   15.00   72.22  394.95   45.48   36.14  ...    37.42    44.18   \n",
       "\"    0.68    4.22    2.41    0.06  152.35    0.06  ...     8.42    11.42   \n",
       "#    0.06    0.06    0.06    0.06    0.06    2.07  ...     0.06     0.06   \n",
       "\n",
       "   topic12  topic13  topic14  topic15  \n",
       "!    64.40   297.29    41.16    11.70  \n",
       "\"     0.07    62.72    12.27     0.06  \n",
       "#     1.07     4.05     0.06     0.06  \n",
       "\n",
       "[3 rows x 16 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 为短消息语料库创建主题向量\n",
    "from sklearn.decomposition import LatentDirichletAllocation as LDiA \n",
    "ldia = LDiA(n_components=16, learning_method='batch') \n",
    "ldia = ldia.fit(bow_docs) \n",
    "# 查看数据\n",
    "ldia.components_.shape\n",
    "# 使宽页显示更美观\n",
    "pd.set_option('display.width', 75) \n",
    "components = pd.DataFrame(ldia.components_.T, index=terms,columns=columns) \n",
    "components.round(2).head(3)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>topic0</th>\n",
       "      <th>topic1</th>\n",
       "      <th>topic2</th>\n",
       "      <th>topic3</th>\n",
       "      <th>topic4</th>\n",
       "      <th>topic5</th>\n",
       "      <th>...</th>\n",
       "      <th>topic10</th>\n",
       "      <th>topic11</th>\n",
       "      <th>topic12</th>\n",
       "      <th>topic13</th>\n",
       "      <th>topic14</th>\n",
       "      <th>topic15</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>sms0</th>\n",
       "      <td>0.00</td>\n",
       "      <td>0.62</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>...</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms1</th>\n",
       "      <td>0.01</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.01</td>\n",
       "      <td>...</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.12</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.01</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms2!</th>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>...</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms3</th>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.09</td>\n",
       "      <td>0.00</td>\n",
       "      <td>...</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sms4</th>\n",
       "      <td>0.39</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.33</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>...</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.09</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 16 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       topic0  topic1  topic2  topic3  topic4  topic5  ...  topic10  \\\n",
       "sms0     0.00    0.62    0.00    0.00    0.00    0.00  ...     0.00   \n",
       "sms1     0.01    0.01    0.01    0.01    0.01    0.01  ...     0.01   \n",
       "sms2!    0.00    0.00    0.00    0.00    0.00    0.00  ...     0.00   \n",
       "sms3     0.00    0.00    0.00    0.00    0.09    0.00  ...     0.00   \n",
       "sms4     0.39    0.00    0.33    0.00    0.00    0.00  ...     0.00   \n",
       "\n",
       "       topic11  topic12  topic13  topic14  topic15  \n",
       "sms0      0.00     0.00     0.00     0.00     0.00  \n",
       "sms1      0.12     0.01     0.01     0.01     0.01  \n",
       "sms2!     0.00     0.00     0.00     0.00     0.00  \n",
       "sms3      0.00     0.00     0.00     0.00     0.00  \n",
       "sms4      0.00     0.09     0.00     0.00     0.00  \n",
       "\n",
       "[5 rows x 16 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看topic3数据\n",
    "components.topic3.sort_values(ascending=False)[:10] \n",
    "# 为所有文档计算LDiA主题向量\n",
    "ldia16_topic_vectors = ldia.transform(bow_docs) \n",
    "ldia16_topic_vectors = pd.DataFrame(ldia16_topic_vectors,index=index, columns=columns) \n",
    "# 查看数据\n",
    "ldia16_topic_vectors.round(2).head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.94"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# LDiA级联LDA实现垃圾消息过滤器\n",
    "# 使用LDiA主题向量训练LDA模型\n",
    "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA \n",
    "from sklearn.model_selection import train_test_split\n",
    "# 设置测试集 训练集\n",
    "X_train, X_test, y_train, y_test = train_test_split(ldia16_topic_vectors, sms.spam, test_size=0.5, random_state=271828) \n",
    "lda = LDA(n_components=1) \n",
    "lda = lda.fit(X_train, y_train) \n",
    "sms['ldia16_spam'] = lda.predict(ldia16_topic_vectors) \n",
    "# 查看结果\n",
    "round(float(lda.score(X_test, y_test)), 2) \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.936"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 32个LDiA主题模型的训练\n",
    "# 使用32个主题\n",
    "ldia32 = LDiA(n_components=32, learning_method='batch') \n",
    "ldia32 = ldia32.fit(bow_docs) \n",
    "ldia32.components_.shape \n",
    "# 计算文档的32维主题向量\n",
    "ldia32_topic_vectors = ldia32.transform(bow_docs) \n",
    "columns32 = ['topic{}'.format(i) for i in range(ldia32.n_components)] \n",
    "ldia32_topic_vectors = pd.DataFrame(ldia32_topic_vectors, index=index,columns=columns32) \n",
    "ldia32_topic_vectors.round(2).head()\n",
    "# 使用32个主题向量训练LDA模型\n",
    "# 设置训练集 测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(ldia32_topic_vectors, sms.spam, test_size=0.5, random_state=271828) \n",
    "lda = LDA(n_components=1) \n",
    "lda = lda.fit(X_train, y_train) \n",
    "sms['ldia32_spam'] = lda.predict(ldia32_topic_vectors) \n",
    "# 检查向量维数\n",
    "X_train.shape \n",
    "# 查看结果\n",
    "round(float(lda.score(X_train, y_train)), 3) \n",
    "round(float(lda.score(X_test, y_test)), 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
  },
  "kernelspec": {
   "display_name": "Python 3.6.8 64-bit",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
